﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Architecture.BusinessLayer;
using LASLogic.BusinessLayer.DataModel;
using LASLogic.DataLayer.Implementor;

namespace LASLogic.BusinessLayer.Requestor
{
    /// <summary>
    /// Clase que maneja la funcionalidad de operaciones relacionadas a los asientos
    /// </summary>
    public class EntryRequestor : IRequestor
    {

        /// <summary>
        /// Inserta un nuevo asiento en el libro finaciero de la compañía
        /// </summary>
        /// <param name="entry">Asiento que se desea agregar en el libro financiero de la compañía</param>
        /// <returns>Booleano que indica si el asiento se insertó bien, true para insertado, false para lo contrario</returns>
        public bool InsertEntry(Entry entry)
        {
            return EntryDataManager.GetInstance().InsertEntry(entry.EntryType,entry.CompanyId, entry.UserId, entry.DocumentDate,
                                                                 entry.Comentario, entry.Reference1, entry.Reference2,
                                                                 entry.Reference3);
        }

        
        /// <summary>
        /// Permite borrar un asiento de la base de datos generando un contra asiento al asiento especificado
        /// </summary>
        /// <param name="entryId">Identificador del asiento a borrar</param>
        /// <returns>Estado del borrado del asiento</returns>
        public bool EraseEntry(int entryId)
        {
            return EntryDataManager.GetInstance().EraseEntry(entryId);
        }

        /// <summary>
        /// Metodo que permite asignar una cuenta con el asiento
        /// </summary>
        /// <param name="entryHasAccount">Cuenta la cual se quiere asignar al asiento</param>
        /// <param name="transactionType">Tipo de transaccion, si es debe o haber</param>
        /// <returns>Booleano indicando el estado de la asignación</returns>
        public bool AddAccountToEntry(EntryHasAccount entryHasAccount, string transactionType)
        {
            return EntryDataManager.GetInstance().AddAccountToEntry(entryHasAccount.AccountId, entryHasAccount.TransactionType, entryHasAccount.LocalBalance, entryHasAccount.SystemBalance,
                                                                    entryHasAccount.ForeignBalance, entryHasAccount.ExchangeRate);
        }



        /// <summary>
        /// Permite obtener todos los asientos de una compañia en particular y acotado por fechas
        /// </summary>
        /// <param name="companyId">Identificador de una compañia</param>
        /// <param name="startDate">Fecha que marca el inicio de donde se quieren traer asientos</param>
        /// <param name="endDate">Fecha que marca el final de donde se quieren traer fechas</param>
        /// <returns>Obtiene todos los asientos de una compañia</returns>
        public List<Entry> GetEntriesFromCompany(int companyId, DateTime startDate, DateTime endDate)
        {
            return EntryDataManager.GetInstance().GetEntriesFromCompany(companyId, startDate,endDate);
        }

        #region Singleton

        /// <summary>
        /// Constructor de la clase FinancialManager
        /// </summary>
        private EntryRequestor()
        {
        }

        /// <summary>
        /// Única instancia de esta clase
        /// </summary>
        private static EntryRequestor _instance;

        /// <summary>
        /// Método para implementar el patrón de Singleton
        /// </summary>
        /// <returns>Instancia única de la clase</returns>
        public static EntryRequestor GetInstance()
        {
            if (_instance == null)
                _instance = new EntryRequestor();
            return _instance;
        }

        #endregion

    }
}
